//假如有一排房子，共 n 个，每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种，你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。
//
// 当然，因为市场上不同颜色油漆的价格不同，所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 n x 3 的正整数矩阵
//costs 来表示的。
//
// 例如，costs[0][0] 表示第 0 号房子粉刷成红色的成本花费；costs[1][2] 表示第 1 号房子粉刷成绿色的花费，以此类推。
//
// 请计算出粉刷完所有房子最少的花费成本。
//
//
//
// 示例 1：
//
//
//输入: costs = [[17,2,17],[16,16,5],[14,3,19]]
//输出: 10
//解释: 将 0 号房子粉刷成蓝色，1 号房子粉刷成绿色，2 号房子粉刷成蓝色。
//     最少花费: 2 + 5 + 3 = 10。
//
//
// 示例 2：
//
//
//输入: costs = [[7,6,2]]
//输出: 2
//
//
//
//
// 提示:
//
//
// costs.length == n
// costs[i].length == 3
// 1 <= n <= 100
// 1 <= costs[i][j] <= 20
//
//
//
//
//
// 注意：本题与主站 256 题相同：https://leetcode-cn.com/problems/paint-house/
//
// Related Topics 数组 动态规划 👍 153 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
function minCost(costs: number[][]): number {

    //? dp[i] 当前刷红，上一个只能是蓝或绿，所以由上一次蓝绿最小值加上当前红的代价得到

    let red = 0, blue = 0, green = 0
    for (const [r, b, g] of costs) {
        [red, blue, green] = [Math.min(blue, green) + r, Math.min(red, green) + b, Math.min(red, blue) + g]
    }
    return Math.min(red, blue, green)
};
//leetcode submit region end(Prohibit modification and deletion)

//? 常规解法
//假如有一排房子，共 n 个，每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种，你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。
//
// 当然，因为市场上不同颜色油漆的价格不同，所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 n x 3 的正整数矩阵
//costs 来表示的。
//
// 例如，costs[0][0] 表示第 0 号房子粉刷成红色的成本花费；costs[1][2] 表示第 1 号房子粉刷成绿色的花费，以此类推。
//
// 请计算出粉刷完所有房子最少的花费成本。
//
//
//
// 示例 1：
//
//
//输入: costs = [[17,2,17],[16,16,5],[14,3,19]]
//输出: 10
//解释: 将 0 号房子粉刷成蓝色，1 号房子粉刷成绿色，2 号房子粉刷成蓝色。
//     最少花费: 2 + 5 + 3 = 10。
//
//
// 示例 2：
//
//
//输入: costs = [[7,6,2]]
//输出: 2
//
//
//
//
// 提示:
//
//
// costs.length == n
// costs[i].length == 3
// 1 <= n <= 100
// 1 <= costs[i][j] <= 20
//
//
//
//
//
// 注意：本题与主站 256 题相同：https://leetcode-cn.com/problems/paint-house/
//
// Related Topics 数组 动态规划 👍 153 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
function minCost2(costs: number[][]): number {

    let n = costs.length, f = new Array(n).fill(0).map(() => new Array(3).fill(0))
    f[0][0] = costs[0][0]   //? f[i][0]表示第i个房子粉刷红色，f[i][1]代表第i个房子粉刷绿色，f[i][2]表示第i个房子粉刷蓝色
    f[0][1] = costs[0][1]
    f[0][2] = costs[0][2]

    for(let i = 1; i < n; i++){
        f[i][0] = Math.min(f[i - 1][1] + costs[i][0], f[i - 1][2] + costs[i][0])
        f[i][1] = Math.min(f[i - 1][0] + costs[i][1], f[i - 1][2] + costs[i][1])
        f[i][2] = Math.min(f[i - 1][0] + costs[i][2], f[i - 1][1] + costs[i][2])
    }
    return Math.min(f[n - 1][0],f[n - 1][1],f[n - 1][2])

};
//leetcode submit region end(Prohibit modification and deletion)
